<?php

/**
 * Модуль шаблонов
 *
 * @author Admin
 * @package defaultPackage
 */
define('FW_TPL_ERRCODE',256);

define('FW_TPL_DIR','./templates');

define('FW_TPL_DEFAULT_NUMBER',10);
//Admin part constants
//Teplates
define('FWAD_TPL_TPLS_VIEW','tpls_view.html');
define('FWAD_TPL_TPLS_CREATE','tpls_create.html');
define('FWAD_TPL_TPLS_EDIT','tpls_edit.html');
//Actions
define('FWAD_TPL_ACTION_DEFAULT',0);
define('FWAD_TPL_ACTION_VIEW',0);
define('FWAD_TPL_ACTION_CREATENEW',1);
define('FWAD_TPL_ACTION_UPLOADNEW',2);
define('FWAD_TPL_ACTION_DELETE',3);
define('FWAD_TPL_ACTION_EDIT',4);
define('FWAD_TPL_ACTION_GETALL',5);
//define('FWAD_TPL_ACTION_EDITTPL',5);
//Error Messages
define('FWAD_TPL_ERRCODE_ALREADYEXIST',0+FW_TPL_ERRCODE);
define('FWAD_TPL_ERRMSG_ALREADYEXIST','Шаблон с таким именем уже существует');
define('FWAD_TPL_ERRCODE_NOTEXIST',1+FW_TPL_ERRCODE);
define('FWAD_TPL_ERRMSG_NOTEXIST','Данной записи не существует');
define('FWAD_TPL_ERRCODE_NOTSPECFILENAME',2+FW_TPL_ERRCODE);
define('FWAD_TPL_ERRMSG_NOTSPECFILENAME','Не задано имя файла');


class ModuleTemplatesAdmin extends ModuleAdmin 
{
	/**
	 * Вызывается AdminController'ом
	 * В обязанности этого метода входит выполнение необходимых действий на основе данных, полученных через GET запрос и проанализированных в методе RequestHandler
	 * Метод должен установить у контороллера: 
	 * main_template - главный шаблон, если не будет установлен, то контроллер будет использовать значение по умолчанию
	 * content_template - контент-шаблон, если не установлен, то контроллер не будет его использовать
	 * Возвращает истину, если ошибки не было
	 *
	 * @return bool Возвращает истину, если ошибки не было
	 */
	public function GetPage($Query)
	{
		define('FWAD_TPL_TPL', $this->controller->cfg['fw_path']."modules/templates/tpls/");
		$this->_requestHandler('FWAD_TPL_ACTION_',FWAD_TPL_ACTION_DEFAULT,$_GET);
		switch ($this->_action)
		{
			case FWAD_TPL_ACTION_VIEW:
				$this->View();
				break;
			case FWAD_TPL_ACTION_CREATENEW:
				if ($this->_fixact==1)
				{
					if ($_POST['filename']!=='')
					{
						$filename = $_POST['filename'];
						if (!eregi('\.(html|htm|shtml|shtm|tpl)$',$filename))
							$filename.='.html';
						
						$id = $this->CreateTemplate($filename,$_POST['type'],$_POST['description']);
						if ($id!==false)
						{
							$row = $this->GetProperties($id);
							$tplhtml = (ini_get('magic_quotes_gpc')=='1')? stripslashes($_POST['tplhtml']) :  $_POST['tplhtml'];
							if ( ($row!==false) && ($this->SetTemplate($row['filename'],$tplhtml)) )
								$this->Success();
							else throw new fwException(FW_ERRMSG,FW_ERRCODE);
						}
						else throw new fwException(FW_ERRMSG,FW_ERRCODE);
					}
					else throw new fwException(FWAD_TPL_ERRMSG_NOTSPECFILENAME,FWAD_TPL_ERRCODE_NOTSPECFILENAME);
				}
				else
				{
					$this->controller->main_template = FWAD_MAIN_TPL;
					$this->controller->content_template = FWAD_TPL_TPL.FWAD_TPL_TPLS_CREATE;
					$this->_assignTplVarsType();
				}
				break;
			case FWAD_TPL_ACTION_UPLOADNEW:
				break;
			case FWAD_TPL_ACTION_DELETE:
				$Result = true;
				for ($i=0;$i<count($_POST['id']);$i++)
				{
					$Result = $Result && $this->DeleteTemplate($_POST['id'][$i]);
				}
				if ($Result)
					$this->View();
				else
					throw new fwException(FW_ERRMSG,FW_ERRCODE);
				break;
			case FWAD_TPL_ACTION_EDIT:
				if ($this->_fixact==1)
				{
					$row = $this->GetProperties($this->_id);
					if ($row!==false)
					{
						
						$filename = strtolower($_POST['filename']);
						
						//if (!preg_match('\\.(html|htm|shtml|shtm|tpl)$',$filename))
						if (!eregi('\.(html|htm|shtml|shtm|tpl)$',$filename))
							$filename.='.html';
						
						if ($row['filename']!=$filename)
						{
							$path = $this->controller->cfg['absolute_path'].FW_TPL_DIR.'/'.$filename;
							if (file_exists($path)) throw new fwException(FWAD_TPL_ERRMSG_ALREADYEXIST,FWAD_TPL_ERRCODE_ALREADYEXIST);
							rename($this->controller->cfg['absolute_path'].FW_TPL_DIR.'/'.$row['filename'],$path);
						}
						$fl = $this->SetProperties($this->_id,$filename,$_POST['type'],$_POST['description']);
						
						$tplhtml = (ini_get('magic_quotes_gpc')=='1')? stripslashes($_POST['tplhtml']) :  $_POST['tplhtml'];
						$fl = $fl && $this->SetTemplate($filename,$tplhtml);

						$this->controller->main_template = FWAD_MAIN_TPL;
						if ($fl)
							$this->Success();
						else $this->controller->content_template = FWAD_ERROROPER_TPL;
					}
					else throw new fwException(FWAD_TPL_ERRMSG_NOTEXIST,FWAD_TPL_ERRCODE_NOTEXIST);
				}
				else 
				{
					$row = $this->GetProperties($this->_id);
					$tplhtml = $this->GetTemplate($row['filename']);
					if ($row!==false)
					{
						$this->controller->tpl->assign('id',$this->_id);
						$this->controller->tpl->assign('filename',$row['filename']);
						$this->controller->tpl->assign('type',$row['type']);
						$this->controller->tpl->assign('description',$row['description']);
						$this->controller->tpl->assign('tplhtml',$tplhtml);
						$this->controller->main_template = FWAD_MAIN_TPL;
						$this->controller->content_template = FWAD_TPL_TPL.FWAD_TPL_TPLS_EDIT;
						$this->_assignTplVarsType($row['type']);
					}
					else throw new fwException(FWAD_TPL_ERRMSG_NOTEXIST,FWAD_TPL_ERRCODE_NOTEXIST);
				}
				break;
		}
	}
	private function _assignTplVarsType($currentType=0)
	{
		$this->controller->tpl->assign('type_options', array(0 => 'Главный шаблон',1 => 'Вспомогательный шаблон'));
		$this->controller->tpl->assign('type_curr',$currentType);
	}
	public function &GetList($startIndex = 0,$cnt = -1,$type=null)
	{
		$Query = "SELECT id,filename,type,description FROM ".FW_DB_TBL_PREFIX.FW_TPL_TABLE;
		if (isset($type)) $Query.=" WHERE type={$type} ";
		if ( ($startIndex==0) && ($cnt==-1))
		{
			//all
			$Result = $this->controller->db->getAll($Query,array(),DB_FETCHMODE_ASSOC);
			if (PEAR::isError($Result))
				throw new fwException($Result->getMessage(),$Result->getCode());
			
			return $Result;
		}
		else
		{
			$Result = $this->controller->db->limitQuery($Query,$startIndex,$cnt);
			if (PEAR::isError($Result))
				throw new fwException($Result->getMessage(),$Result->getCode());
			
			While ($row=$Result->fetchRow(DB_FETCHMODE_ASSOC))
				$rows[]=$row;
			return $rows;
		}
		return false;
	}
	public function CreateTemplate($filename,$type,$description)
	{
		if ( !isset($filename) || !isset($type) || !isset($description)) return false;
		
		$Result = $this->controller->db->getOne("SELECT COUNT(id) FROM ".FW_DB_TBL_PREFIX.FW_TPL_TABLE." WHERE filename='{$filename}'");
		if ($Result>0) 
			throw new fwException(FWAD_TPL_ERRMSG_ALREADYEXIST,FWAD_TPL_ERRCODE_ALREADYEXIST);
		$Result = $this->controller->db->query("INSERT INTO ".FW_DB_TBL_PREFIX.FW_TPL_TABLE."(filename,type,description) VALUES('{$filename}',{$type},'{$description}')");
		if (PEAR::isError($Result))
			throw new fwException($Result->getMessage(), $Result->getCode());
		
		$Result = $this->controller->db->getOne("SELECT LAST_INSERT_ID() FROM ".FW_DB_TBL_PREFIX.FW_TPL_TABLE);
		if (PEAR::isError($Result))
			throw new fwException($Result->getMessage(), $Result->getCode());
		
		//создаем файл на диске;
		$f = fopen($this->controller->cfg['absolute_path'].FW_TPL_DIR.'/'.$filename,"w");
		if ($f===false)
			throw new fwException(FW_ERRMSG_FS, FW_ERRCODE_FS); 
		fclose($f);
		return (int) $Result;
	}
	public function UploadTemplate(){}
	public function DeleteTemplate($id)
	{
		$cnt = $this->controller->db->getOne("SELECT COUNT(id) FROM ".FW_DB_TBL_PREFIX.FW_TPL_TABLE." WHERE id={$id}");
		if ($cnt<1) throw new fwException(FWAD_TPL_ERRMSG_NOTEXIST,FWAD_TPL_ERRCODE_NOTEXIST);
		
		$row = $this->GetProperties($id);
		if ($row===false)
			throw  new fwException(FWAD_TPL_ERRMSG_NOTEXIST,FWAD_TPL_ERRCODE_NOTEXIST);
		
		$Result = $this->controller->db->query("DELETE FROM ".FW_DB_TBL_PREFIX.FW_TPL_TABLE." WHERE id={$id}");
		if (PEAR::isError($Result)) 
			throw  new fwException($Result->getMessage(),$Result->getCode());
			
		unlink($this->controller->cfg['absolute_path'].FW_TPL_DIR.'/'.$row['filename']);
		//delete($this->controller->cfg['absolute_path'].FW_TPL_DIR.'/'.$filename);
		
		return true;
	}
	/**
	 * Возвращает параметры шаблона заданного идентификатором id
	 * Возвращаемое значение - ассоц массив. или false если произошла ошибка
	 *
	 * @param int $id - идентификатор записи
	 * @return array() or bool 
	 */
	public function GetProperties($id)
	{
		$Result = $this->controller->db->query("SELECT filename,description,type FROM ".FW_DB_TBL_PREFIX.FW_TPL_TABLE." WHERE id={$id}");
		if (PEAR::isError($Result))	
			throw new fwException($Result->getMessage(), $Result->getCode()); 
		$row=$Result->fetchRow(DB_FETCHMODE_ASSOC );
		if ($row)
			return $row;
		return false;
	}
	public function SetProperties($id,$filename,$type,$description)
	{
		$Result = $this->controller->db->getOne("SELECT COUNT(id) FROM ".FW_DB_TBL_PREFIX.FW_TPL_TABLE." WHERE id={$id}");
		if (PEAR::isError($Result))	
			throw new fwException($Result->getMessage(), $Result->getCode());
		if ($Result==1)
		{
			$Result = $this->controller->db->query("UPDATE ".FW_DB_TBL_PREFIX.FW_TPL_TABLE." SET filename='{$filename}', type={$type}, description='{$description}' WHERE id={$id}");
			if (PEAR::isError($Result))	
				throw new fwException($Result->getMessage(), $Result->getCode());
			return true;
		}
		return false;
	}
	public function & GetTemplate($filename)
	{
		$path = $this->controller->cfg['absolute_path'].FW_TPL_DIR.'/'.$filename;
		if (!file_exists($path)) return false;
		
		$f = fopen($path,'r');
		if ($f===false)
			throw new fwException(FW_ERRMSG_FS, FW_ERRCODE_FS);
		$contents = fread ($f, filesize ($path));
		fclose ($f);
		return $contents;
	}
	public function SetTemplate($filename,&$template)
	{
		$path = $this->controller->cfg['absolute_path'].FW_TPL_DIR.'/'.$filename;
		if (!file_exists($path)) return false;
		//print $path;
			
		$f = fopen($path,'w');
		if ($f===false) 
			throw new fwException(FW_ERRMSG_FS, FW_ERRCODE_FS);
		fwrite($f,$template);
		fclose($f);
		return true;
	}
	public function View()
	{
		$Pager = $this->_getPager(FW_DB_TBL_PREFIX.FW_TPL_TABLE,FW_TPL_DEFAULT_NUMBER);
		$Arr = $this->GetList($Pager[0],FW_TPL_DEFAULT_NUMBER);
		if ($Arr!==false)
		{
			$this->controller->tpl->assign('pager',$Pager[1]);
			$this->controller->tpl->assign('RowsCount',$Pager[2]);
			$this->controller->tpl->assign('currentPage',$Pager[3]);
			$this->controller->tpl->assign('perPage',FW_TPL_DEFAULT_NUMBER);
			$this->controller->tpl->assign('tpls',$Arr);
				
			$this->controller->main_template = FWAD_MAIN_TPL;
			$this->controller->content_template = FWAD_TPL_TPL.FWAD_TPL_TPLS_VIEW;
		}
	}
	static function Install(&$cfg,&$db,$deleteTables)
	{
		if ($deleteTables)
		{
			$Result = $db->query('DROP TABLE IF EXISTS '.FW_DB_TBL_PREFIX.FW_TPL_TABLE);
			if (PEAR::isError($Result))	
				throw new fwException($Result->getMessage(), $Result->getCode());
		}
		$Result = $db->query("CREATE TABLE ".FW_DB_TBL_PREFIX.FW_TPL_TABLE." (
  `id` int(10) unsigned NOT NULL auto_increment,
  `filename` varchar(64) default NULL,
  `type` tinyint(3) unsigned default '0',
  `description` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;");
		if (PEAR::isError($Result))
			throw new fwException($Result->getMessage(), $Result->getCode());
	}
	protected function Success()
	{
		$this->controller->tpl->assign('RedirectUrl','index.php?module=templates');
		parent::Success();
	}	
}
?>